Program Listing for File estimator.h
↰ Return to documentation for file (codes/slam/estimator/estimator.h
)
/*******************************************************
* Copyright (C) 2019, Robotics Group, Nanyang Technology University
*
* \file estimator.h
* \author Zhang Handuo (hzhang032@e.ntu.edu.sg)
* \date Januarary 2017
* \brief SLAM main process of SSLAM-pose_graph.
*
* Licensed under the GNU General Public License v3.0;
* you may not use this file except in compliance with the License.
*
*******************************************************/
#pragma once
#include <thread>
#include <mutex>
#include <atomic>
#include <std_msgs/Header.h>
#include <std_msgs/Float32.h>
#include <ceres/ceres.h>
#include <unordered_map>
#include <queue>
#include <opencv2/core/eigen.hpp>
#include <eigen3/Eigen/Dense>
#include <eigen3/Eigen/Geometry>
#include "parameters.h"
#include "feature_manager.h"
#include "../utility/utility.h"
#include "../utility/tic_toc.h"
#include "../initial/solve_5pts.h"
#include "../initial/initial_sfm.h"
#include "../initial/initial_alignment.h"
#include "../initial/initial_ex_rotation.h"
#include "../factor/imu_factor.h"
#include "../factor/ins_factor.h"
#include "../factor/pose_local_parameterization.h"
#include "../factor/marginalization_factor.h"
#include "../factor/projectionTwoFrameOneCamFactor.h"
#include "../factor/projectionTwoFrameTwoCamFactor.h"
#include "../factor/projectionOneFrameTwoCamFactor.h"
#include "../featureTracker/feature_tracker.h"
using namespace noiseFactor;
namespace slam_estimator {
class Estimator {
public:
#ifndef DOXYGEN_SHOULD_SKIP_THIS
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
#endif /* DOXYGEN_SHOULD_SKIP_THIS */
Estimator();
~Estimator();
void setParameter();
void startProcessThread();
// interface
void initFirstPose(const Eigen::Vector3d &p, const Eigen::Matrix3d r);
void inputIMU(double t, const Vector3d &linearAcceleration, const Vector3d &angularVelocity);
void inputINS(double t, const Vector3d &linearSpeed, const Quaterniond &angularRead, const double height);
void inputFeature(double t, const map<int, vector<pair<int, Eigen::Matrix<double, 7, 1>>>> &featureFrame);
void
inputImage(double t, const cv::Mat &_img, const cv::Mat &_img1 = cv::Mat(), const cv::Mat &_mask = cv::Mat());
void processIMU(double t, double dt, const Vector3d &linear_acceleration, const Vector3d &angular_velocity);
void processINS(double t, double dt, const Vector3d &linear_speed,
const Quaterniond &angular_read, const double height_, const bool last_);
void processImage(const map<int, vector<pair<int, Eigen::Matrix<double, 7, 1>>>> &image, const double header);
void processMeasurements();
void clearState();
bool initialStructure();
bool visualInitialAlign();
bool relativePose(Matrix3d &relative_R, Vector3d &relative_T, int &l);
void slideWindow();
void slideWindowNew();
void slideWindowOld();
//***************************************************************************************
//
//
//***************************************************************************************
void optimization();
//***************************************************************************************
//
//***************************************************************************************
void vector2double();
//***************************************************************************************
//
//***************************************************************************************
void double2vector();
bool failureDetection();
bool getIMUInterval(double t0, double t1, vector<pair<double, Eigen::Vector3d>> &accVector,
vector<pair<double, Eigen::Vector3d>> &gyrVector);
bool getINSInterval(double t0, double t1, vector<pair<double, Eigen::Vector3d>> &spdVector,
vector<pair<double, Eigen::Quaterniond>> &angVector,
vector<pair<double, double>> &heightVector);
void getPoseInWorldFrame(Eigen::Matrix4d &T);
void getPoseInWorldFrame(int index, Eigen::Matrix4d &T);
void predictPtsInNextFrame();
void outliersRejection(set<int> &removeIndex);
double reprojectionError(Matrix3d &Ri, Vector3d &Pi, Matrix3d &rici, Vector3d &tici,
Matrix3d &Rj, Vector3d &Pj, Matrix3d &ricj, Vector3d &ticj,
double depth, Vector3d &uvi, Vector3d &uvj);
void updateLatestStates();
void fastPredictIMU(double t, const Eigen::Vector3d &linear_acceleration,
const Eigen::Vector3d &angular_velocity);
void fastPredictINS(double t, const Eigen::Vector3d &linear_speed,
const Eigen::Quaterniond &angular_read);
bool IMUAvailable(double t);
bool INSAvailable(double t);
void initFirstIMUPose(vector<pair<double, Eigen::Vector3d>> &accVector);
void initFirstINSPose(vector<pair<double, Eigen::Vector3d>> &spdVector,
vector<pair<double, Eigen::Quaterniond>> &angVector,
vector<pair<double, double>> heightVector);
enum SolverFlag {
INITIAL,
NON_LINEAR
};
enum MarginalizationFlag {
MARGIN_OLD = 0,
MARGIN_SECOND_NEW = 1
};
unsigned int count_;
std::mutex mBuf;
std::mutex mProcess;
queue<pair<double, Eigen::Vector3d>> accBuf;
queue<pair<double, Eigen::Vector3d>> gyrBuf;
queue<pair<double, Eigen::Vector3d>> spdBuf;
queue<pair<double, Eigen::Quaterniond>> angBuf;
queue<pair<double, double>> heightBuf;
queue<pair<double, map<int, vector<pair<int, Eigen::Matrix<double, 7, 1> > > > > > featureBuf;
vector<pair<double, vector<double>>> gpsVec;
double prevTime, curTime;
bool openExEstimation;
// std::thread trackThread;
std::thread processThread;
atomic<bool> processThread_swt; // this goes in while(1) aka inf-while of processThread
FeatureTracker featureTracker;
SolverFlag solver_flag;
MarginalizationFlag marginalization_flag;
Vector3d g;
Matrix3d ric[2];
Vector3d tic[2];
Vector3d Ps[(WINDOW_SIZE + 1)];
Vector3d Vs[(WINDOW_SIZE + 1)];
Matrix3d Rs[(WINDOW_SIZE + 1)];
Vector3d Bas[(WINDOW_SIZE + 1)];
Vector3d Bgs[(WINDOW_SIZE + 1)];
double td;
Matrix3d back_R0, last_R, last_R0;
Vector3d back_P0, last_P, last_P0;
double Headers[(WINDOW_SIZE + 1)];
double last_time;
IntegrationBase *pre_integrations[(WINDOW_SIZE + 1)];
Vector3d acc_0, gyr_0;
Quaterniond ang_0;
vector<double> dt_buf[(WINDOW_SIZE + 1)];
vector<double> t_buf[(WINDOW_SIZE + 1)];
vector<Vector3d> linear_acceleration_buf[(WINDOW_SIZE + 1)];
vector<Vector3d> angular_velocity_buf[(WINDOW_SIZE + 1)];
vector<Vector3d> linear_speed_buf[(WINDOW_SIZE + 1)];
vector<Quaterniond> angular_read_buf[(WINDOW_SIZE + 1)];
// vector<double> height_read_buf[(WINDOW_SIZE + 1)];
double sum_dt[(WINDOW_SIZE + 1)];
int frame_count;
int sum_of_outlier, sum_of_back, sum_of_front, sum_of_invalid;
int inputImageCnt;
FeatureManager f_manager;
MotionEstimator m_estimator;
InitialEXRotation initial_ex_rotation;
bool first_imu, first_ins;
bool is_valid, is_key;
bool failure_occur;
vector<Vector3d> point_cloud;
vector<Vector3d> margin_cloud;
vector<Vector3d> key_poses;
double initial_timestamp;
double para_Pose[WINDOW_SIZE + 1][SIZE_POSE];
double para_SpeedBias[WINDOW_SIZE + 1][SIZE_SPEEDBIAS];
double para_Feature[NUM_OF_F][SIZE_FEATURE];
double para_Ex_Pose[2][SIZE_POSE];
double para_Retrive_Pose[SIZE_POSE];
double para_Td[1][1];
double para_Tr[1][1];
double sensor_h;
int loop_window_index;
MarginalizationInfo *last_marginalization_info;
vector<double *> last_marginalization_parameter_blocks;
map<double, ImageFrame> all_image_frame;
IntegrationBase *tmp_pre_integration;
Eigen::Matrix3d cov_position;
Eigen::Vector3d initP;
Eigen::Matrix3d initR;
double latest_time;
Eigen::Vector3d latest_P, latest_V, latest_Ba, latest_Bg,
latest_acc_0, latest_gyr_0, last_vec_rev, latest_spd_0;
Eigen::Quaterniond latest_Q, last_ang_rev;
bool initFirstPoseFlag;
bool initThreadFlag;
};
}